大文字小文字の区別
原文「Case Sensitivity」
通常、Basicでは、大文字と小文字を区別しません。しかしながら、これは、必ずしも、UNOとBasicの間のコミュニケーションには適用されません。大文字と小文字を区別に関する問題を避けるために、まるでBasicが大文字と小文字の区別ができるように、UNO関連のコードを記述します。これは、他の言語へのBasicプログラムの翻訳をしやすくし、そして、Basicコードを読み込んで、理解することがより簡単になります。以下で、発生するかもしれない問題について説明します。
それらが、UNOオブジェクト・プロパティ、メソッドと構造体のメンバーで使用されるとき、大文字と小文字が異なる識別子は、同一であるとみなされます。
Dim ALocale As New com.sun.star.lang.Locale
alocale.language = "en" ' Ok
MsgBox aLocale.Language ' Ok
これに対する例外は、com.sun.star.container.XNameAccessによってBasicプロパティが取得された場合です。先に述べたように、その名前は、API参照の中と同じように、正確に、記述する必要があります。Basicは、文字列のパラメータとして、名前を使用します。そのメソッドを使用して、com.sun.star.container.XNameAccessを呼び出すとき、それは、解釈されません。
' oNameAccessible is an object that supports XNameAccess
' oNameAccessibleは、XNameAccessをサポートするオブジェクトです。
' including the names "Value1", "Value2"
' 名前"Value1"、"Value2"が、含まれています。
x = oNameAccessible.Value1 ' Ok
y = oNameAccessible.VaLUe2 ' Runtime Error, Value2 is not written correctly
'実行時エラー、Value2は、適切に記述されていません
' is the same as
x = oNameAccessible.getByName( "Value1" ) ' Ok
y = oNameAccessible.getByName( "VaLUe2" ) ' Runtime Error, Value2 is not written correctly
'実行時エラー、Value2は、適切に記述されていません
例外処理
UNOとは異なり、Basicは例外をサポートしていません。Basicランタイム・システムによって変換され、Basicのエラーに変換されることで、UNOによって、捕えられることで、すべての例外が、投げられます。次のコードを実行すると、結果として、コードの実行を中断して、エラーメッセージを表示するBasicエラーが発生します。:
Sub Main
Dim oLib
oLib = BasicLibraries.getByName( "InvalidLibraryName" )
End Sub
例で使用されるBasicLibrariesオブジェクトには、実行オフィス・インスタンスのすべての利用可能なBasicライブラリが含まれています。BasicLibrariesに含まれているBasicライブラリは、com.sun.star.container.XNameAccessを使用して呼び出されます。 存在しないライブラリを取得しようとすると、例外が発生します。BasicLibrariesオブジェクトは、Advanced Library Organizationで更に詳細に説明されます。
getByName()を呼び出すと、次のエラーボックスが表示されます。:
未処理のUNO例外
しかしながら、Basicランタイム・システムは、常に、Exception型を認識することができません。ときどき、オブジェクト実装で提供される必要がある例外メッセージだけが、表示されることがあります。
Basicエラーに変換される例外は、まさに、On Error GoToコマンドを使用しているBasicエラーのように、処理することができます。:
Sub Main
On Error Goto ErrorHandler ' Enables error handling
'エラー処理を有効にします
Dim oLib
oLib = BasicLibraries.getByName( "InvalidLibraryName" )
MsgBox "After the Error"
Exit Sub
' Label
ErrorHandler:
MsgBox "Error code: " + Err + Chr$(13) + Error$
Resume Next ' Continues execution at the command following the error command
' エラー・コマンドの後、コマンドで実行を続けます
End Sub
例外が、発生するとき、実行は、ErrorHandlerラベルで継続されます。エラー・ハンドラーでは、いくつかのプロパティは、エラーに関する情報を取得するために使用されます。1のErrは、UNOの例外ためのエラーコードです。Error$には、エラーメッセージのテキストが含まれています。プログラムを実行すると、次のように出力されます。:
他のメッセージボックス"After the Error"は、上記のダイアログ・ボックスの後に表示されます。なぜなら、Resume Nextは、例外が投げられた行の下にあるコード行に移動します。Exit Subコマンドが、必要です。エラー・ハンドラー・コードが、再度、実行されることはありません。
リスナー
原文「Listeners」
UNOの多くのインターフェイスは、リスナーが、フィードバックを取得するために、特別なリスナー・インターフェイスを実装しているリスナー・オブジェクトを登録するために、使用されます。その適切なリスナー・メソッドが呼び出されるとき、OpenOffice.org Basicは、オブジェクト実装のコンセプトをサポートしていません。その結果、CreateUnoListener()という名前の特別なRTL関数が、導入されました。それは、UNOからコール・バックすることができるメソッド名のための接頭辞を使用します。CreateUnoListener()は、メソッド名の接頭辞と適当と思われるリスナー・インターフェイスの型の名前を必要とします。 それは、リスナーを登録するために、使用することができる、このインターフェイスをサポートするオブジェクトを返します。 次の例は、com.sun.star.container.XContainerListenerをインスタンス化します。接頭辞ContListener_に注意してください。:
Dim oListener
oListener = CreateUnoListener( "ContListener_", "com.sun.star.container.XContainerListener"
次の手順では、リスナメソッドを実装します。この例では、リスナー・インターフェイスは、次に示す、メソッドを持っています。:
disposing() | インターフェイスcom.sun.star.lang.XEventListenerに基づいたリスナーのメソッドは、すべてのリスナー・インターフェイスに含まれています。なぜなら、すべてのリスナー・インターフェイスは、この基準となるインターフェイスから派生している必要があります。com.sun.star.lang.EventObjectを取得します |
elementInserted() | インターフェイスcom.sun.star.container.XContainerListenerのメソッド。com.sun.star.container.ContainerEventを取得します。 |
elementRemoved() | インターフェイスcom.sun.star.container.XContainerListenerのメソッド。ContainerEventを取得します。 |
elementReplaced() | インターフェイスcom.sun.star.container.XContainerListenerのメソッド。com.sun.star.container.ContainerEventを取得します。 |
例の中では、ContListener_は、名前接頭辞として指定されています。その結果、次のsubsは、Basicで、実装する必要があります。
- ContListener_disposing
- ContListener_elementInserted
- ContListener_elementRemoved
- ContListener_elementReplaced
すべてのリスナー型は、イベントに関する情報が含まれている、対応するEvent構造体型を持っています。リスナー・メソッドが、呼び出されるとき、このEvent型のインスタンスは、パラメータとして渡されます。Basicリスナー・メソッドでは、適切なVariantパラメータをプロシージャ・ヘッダに追加することによって、これらのEventオブジェクトを評価すことができます。 次に示すコードは、この例のリスナー・メソッドを、どのように実装するかを示しています。:
Sub ContListener_disposing( oEvent )
MsgBox "disposing"
MsgBox oEvent.Dbg_Properties
End Sub
Sub ContListener_elementInserted( oEvent )
MsgBox "elementInserted"
MsgBox oEvent.Dbg_Properties
End Sub
Sub ContListener_elementRemoved( oEvent )
MsgBox "elementRemoved"
MsgBox oEvent.Dbg_Properties
End Sub
Sub ContListener_elementReplaced( oEvent )
MsgBox "elementReplaced"
MsgBox oEvent.Dbg_Properties
End Sub
リスナーの親インターフェイスのリスナー・メソッドを含めた、すべてのリスナー・メソッドを実装する必要があります。イベントが発生するたびに、そして、ブロードキャスターは、Basicプログラムが実行された後、長い間、破壊される場合があるため、特にdisposing()で、対応するBasic subが見つからないたびに、Basicランタイム・エラーが発生します。この状況では、Basicは、"Method not found"メッセージを表示します。どのメソッドが見つからないのか、なぜBasicがメソッドを探しているのかはわかりません。
私たちは、基本的なライブラリ・コンテナでイベントを聞き取っています。「ツール - マクロ - オーガナイザ」ダイアログでユーザーの動作で起動されるイベントのための私たちの単純な実装は、イベント構造体のDbg_Propertiesを含む、対応するリスナー・メソッド名とメッセージボックスによるメッセージボックスを表示します。disposing()メソッドのための、イベント・オブジェクトの型は、com.sun.star.lang.EventObjectです。他の全てのメソッドは、com.sun.star.container.XContainerListenerに属しています。その結果、イベント・オブジェクトの型は、com.sun.star.container.ContainerEventです。この型は、com.sun.star.lang.EventObjectから派生しています。そして、追加のコンテナに関連づけられた情報が含まれています
イベント・オブジェクトが、必要でない場合、パラメータは、実装から除外される可能性があります。例えば、disposing()メソッドは、以下の通りです:
' Minimal implementation of Sub disposing
' Subを破棄する最小限の実装
Sub ContListener_disposing
End Sub
リスナー・メソッドに渡されるイベント・オブジェクトは、他の構造体オブジェクトのように呼び出すことができます。次に示すコードは、elementRemoved()メソッドの拡張された実装を示しています。Library1とモジュール・ソース・コードから削除されるモジュールの名前を表示するために、それはcom.sun.star.container.ContainerEventを評価します。:
sub ContListener_ElementRemoved( oEvent )
MsgBox "Element " + oEvent.Accessor + " removed"
MsgBox "Source =" + Chr$(13) + Chr$(13) + oEvent.Element
End Sub
ユーザーが、Module1を削除するとき、次のメッセージボックスが、ContListener_ElementRemoved()によって表示されます:
ContListener_ElementRemovedメッセージ
ContListener_ElementRemovedイベント・コールバック
すべての必要なリスナー・メソッドが、実装されるとき、適切なaddメソッドを呼び出すことによって、リスナーをブロードキャスター・オブジェクトに追加します。XContainerListenerを登録するために、私たちのコンテナに対応する登録メソッドは、addContainerListener()です。:
Dim oLib
oLib = BasicLibraries.Library1 ' Library1 must exist!
' Library1が存在する必要があります
oLib.addContainerListener( oListener ) ' Register the listener
' リスナーを登録します
名をつけたスキームXSomeEventListener <> addSomeEventListener()は、OpenOffice.org APIを通して使用されます。
コンテナ・イベントのリスナーが、永続的に登録されるようになりました。コンテナ・イベントが、発生するとき、コンテナは、私たちのBasicコードで、com.sun.star.container.XContainerListenerインターフェイスの適切なメソッドを呼び出します。